package com.timemetro.app;

import android.graphics.Matrix;

/**
 * Created by gabik on 16.05.15.
 */
public class ScaleAndTranslate {
//    Переменные для изменений масштаба:
    private static float scale = 1;

//    Переменный для изменения позиции:
    private static float touchPositionX = 0;                    // Координаты прикосновения к экрану X,Y(здесь и далее: перменная ниже);
    private static float touchPositionY = 0;

    private static float currentPositionX = 0;                  // Текущая координата сцены X,Y;
    private static float currentPositionY = 0;

    private static float startPositionX = 0;                    // Точка относительно который изменяется текущая координата сцены. Начальное прикосновение. X,Y
    private static float startPositionY = 0;

    private final static float MIN_SCALE = 0.01f;
    private final static float MEAN_SCALE = 0.02f;
    private final static float MAX_SCALE = 0.05f;

    /**
     * Переменная необходима для запрета перемещения сцены, пока не завершится масштабирование,
     * и на экране не останется активных прикосновений.
     * */
    private static boolean isScale;

    public static void setIsScaleTouchFalse(){
        isScale = false;
    }

    /*
    * Установка нового масштаба изображения*/
    public static void setNewPositionScale(double distance) {
        isScale = true;
        diffDistance = distance - ScaleAndTranslate.distance;
        ScaleAndTranslate.distance = distance;
//        Если разность изменения расстояния между прикосновениями мала ( -1 до 1), оставляем масштаб без изменений.
        if (diffDistance > -1 && diffDistance < 1) return;
//        Уменьшаем масштаб, используя три разные скорости, в зависимости от размера разности между прикосновениями.
        if (diffDistance < -1){
            if (scale <= 0.5) return;
            if (diffDistance < -10) {scale -= MAX_SCALE; return;}
            if (diffDistance < -5) {scale -= MEAN_SCALE; return;}
            if (diffDistance < -1) {scale -= MIN_SCALE; return;}
//        Увеличиваем масштаб... (далее смотрите комментарий выше).
        } else {
            if (scale >= 3) return;
            if (diffDistance > 10) {scale += MAX_SCALE; return;}
            if (diffDistance > 5) {scale += MEAN_SCALE; return;}
            if (diffDistance > 1) {scale += MIN_SCALE; return;}
        }
    }

    public static void setNewPositionTranslate(float positionX, float positionY) {
        if (isScale == false) {                     // Если масштабирование завершено.
            float deltaX = positionX - touchPositionX;
            float deltaY = positionY - touchPositionY;
            ScaleAndTranslate.currentPositionX = startPositionX + deltaX;
            ScaleAndTranslate.currentPositionY = startPositionY + deltaY;
        }
    }

    public static void setStartPoint(float positionX, float positionY)
    {
        touchPositionX = positionX;
        touchPositionY = positionY;
    }
    public static void setFinishPoint(){
        startPositionX = currentPositionX;
        startPositionY = currentPositionY;

    }


    public static double getDistance() {
        return distance;
    }

    private static double distance;
    private static double diffDistance;
    public static Matrix getMatrix(){

        Matrix matrix = new Matrix();
        matrix.reset();
        matrix.setScale(scale, scale);
        matrix.postTranslate(currentPositionX, currentPositionY);
        return matrix;
    }
}

enum StatusTouch{
    scale,
    position,
    none
}
